<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * 将汉字转化为拼音(支持utf-8和gb2312编码)
 *
 * @author leechao
 */
class Pinyin {

    var $_py = array(
        array("a", -20319),
        array("ai", -20317),
        array("an", -20304),
        array("ang", -20295),
        array("ao", -20292),
        array("ba", -20283),
        array("bai", -20265),
        array("ban", -20257),
        array("bang", -20242),
        array("bao", -20230),
        array("bei", -20051),
        array("ben", -20036),
        array("beng", -20032),
        array("bi", -20026),
        array("bian", -20002),
        array("biao", -19990),
        array("bie", -19986),
        array("bin", -19982),
        array("bing", -19976),
        array("bo", -19805),
        array("bu", -19784),
        array("ca", -19775),
        array("cai", -19774),
        array("can", -19763),
        array("cang", -19756),
        array("cao", -19751),
        array("ce", -19746),
        array("ceng", -19741),
        array("cha", -19739),
        array("chai", -19728),
        array("chan", -19725),
        array("chang", -19715),
        array("chao", -19540),
        array("che", -19531),
        array("chen", -19525),
        array("cheng", -19515),
        array("chi", -19500),
        array("chong", -19484),
        array("chou", -19479),
        array("chu", -19467),
        array("chuai", -19289),
        array("chuan", -19288),
        array("chuang", -19281),
        array("chui", -19275),
        array("chun", -19270),
        array("chuo", -19263),
        array("ci", -19261),
        array("cong", -19249),
        array("cou", -19243),
        array("cu", -19242),
        array("cuan", -19238),
        array("cui", -19235),
        array("cun", -19227),
        array("cuo", -19224),
        array("da", -19218),
        array("dai", -19212),
        array("dan", -19038),
        array("dang", -19023),
        array("dao", -19018),
        array("de", -19006),
        array("deng", -19003),
        array("di", -18996),
        array("dian", -18977),
        array("diao", -18961),
        array("die", -18952),
        array("ding", -18783),
        array("diu", -18774),
        array("dong", -18773),
        array("dou", -18763),
        array("du", -18756),
        array("duan", -18741),
        array("dui", -18735),
        array("dun", -18731),
        array("duo", -18722),
        array("e", -18710),
        array("en", -18697),
        array("er", -18696),
        array("fa", -18526),
        array("fan", -18518),
        array("fang", -18501),
        array("fei", -18490),
        array("fen", -18478),
        array("feng", -18463),
        array("fo", -18448),
        array("fou", -18447),
        array("fu", -18446),
        array("ga", -18239),
        array("gai", -18237),
        array("gan", -18231),
        array("gang", -18220),
        array("gao", -18211),
        array("ge", -18201),
        array("gei", -18184),
        array("gen", -18183),
        array("geng", -18181),
        array("gong", -18012),
        array("gou", -17997),
        array("gu", -17988),
        array("gua", -17970),
        array("guai", -17964),
        array("guan", -17961),
        array("guang", -17950),
        array("gui", -17947),
        array("gun", -17931),
        array("guo", -17928),
        array("ha", -17922),
        array("hai", -17759),
        array("han", -17752),
        array("hang", -17733),
        array("hao", -17730),
        array("he", -17721),
        array("hei", -17703),
        array("hen", -17701),
        array("heng", -17697),
        array("hong", -17692),
        array("hou", -17683),
        array("hu", -17676),
        array("hua", -17496),
        array("huai", -17487),
        array("huan", -17482),
        array("huang", -17468),
        array("hui", -17454),
        array("hun", -17433),
        array("huo", -17427),
        array("ji", -17417),
        array("jia", -17202),
        array("jian", -17185),
        array("jiang", -16983),
        array("jiao", -16970),
        array("jie", -16942),
        array("jin", -16915),
        array("jing", -16733),
        array("jiong", -16708),
        array("jiu", -16706),
        array("ju", -16689),
        array("juan", -16664),
        array("jue", -16657),
        array("jun", -16647),
        array("ka", -16474),
        array("kai", -16470),
        array("kan", -16465),
        array("kang", -16459),
        array("kao", -16452),
        array("ke", -16448),
        array("ken", -16433),
        array("keng", -16429),
        array("kong", -16427),
        array("kou", -16423),
        array("ku", -16419),
        array("kua", -16412),
        array("kuai", -16407),
        array("kuan", -16403),
        array("kuang", -16401),
        array("kui", -16393),
        array("kun", -16220),
        array("kuo", -16216),
        array("la", -16212),
        array("lai", -16205),
        array("lan", -16202),
        array("lang", -16187),
        array("lao", -16180),
        array("le", -16171),
        array("lei", -16169),
        array("leng", -16158),
        array("li", -16155),
        array("lia", -15959),
        array("lian", -15958),
        array("liang", -15944),
        array("liao", -15933),
        array("lie", -15920),
        array("lin", -15915),
        array("ling", -15903),
        array("liu", -15889),
        array("long", -15878),
        array("lou", -15707),
        array("lu", -15701),
        array("lv", -15681),
        array("luan", -15667),
        array("lue", -15661),
        array("lun", -15659),
        array("luo", -15652),
        array("ma", -15640),
        array("mai", -15631),
        array("man", -15625),
        array("mang", -15454),
        array("mao", -15448),
        array("me", -15436),
        array("mei", -15435),
        array("men", -15419),
        array("meng", -15416),
        array("mi", -15408),
        array("mian", -15394),
        array("miao", -15385),
        array("mie", -15377),
        array("min", -15375),
        array("ming", -15369),
        array("miu", -15363),
        array("mo", -15362),
        array("mou", -15183),
        array("mu", -15180),
        array("na", -15165),
        array("nai", -15158),
        array("nan", -15153),
        array("nang", -15150),
        array("nao", -15149),
        array("ne", -15144),
        array("nei", -15143),
        array("nen", -15141),
        array("neng", -15140),
        array("ni", -15139),
        array("nian", -15128),
        array("niang", -15121),
        array("niao", -15119),
        array("nie", -15117),
        array("nin", -15110),
        array("ning", -15109),
        array("niu", -14941),
        array("nong", -14937),
        array("nu", -14933),
        array("nv", -14930),
        array("nuan", -14929),
        array("nue", -14928),
        array("nuo", -14926),
        array("o", -14922),
        array("ou", -14921),
        array("pa", -14914),
        array("pai", -14908),
        array("pan", -14902),
        array("pang", -14894),
        array("pao", -14889),
        array("pei", -14882),
        array("pen", -14873),
        array("peng", -14871),
        array("pi", -14857),
        array("pian", -14678),
        array("piao", -14674),
        array("pie", -14670),
        array("pin", -14668),
        array("ping", -14663),
        array("po", -14654),
        array("pu", -14645),
        array("qi", -14630),
        array("qia", -14594),
        array("qian", -14429),
        array("qiang", -14407),
        array("qiao", -14399),
        array("qie", -14384),
        array("qin", -14379),
        array("qing", -14368),
        array("qiong", -14355),
        array("qiu", -14353),
        array("qu", -14345),
        array("quan", -14170),
        array("que", -14159),
        array("qun", -14151),
        array("ran", -14149),
        array("rang", -14145),
        array("rao", -14140),
        array("re", -14137),
        array("ren", -14135),
        array("reng", -14125),
        array("ri", -14123),
        array("rong", -14122),
        array("rou", -14112),
        array("ru", -14109),
        array("ruan", -14099),
        array("rui", -14097),
        array("run", -14094),
        array("ruo", -14092),
        array("sa", -14090),
        array("sai", -14087),
        array("san", -14083),
        array("sang", -13917),
        array("sao", -13914),
        array("se", -13910),
        array("sen", -13907),
        array("seng", -13906),
        array("sha", -13905),
        array("shai", -13896),
        array("shan", -13894),
        array("shang", -13878),
        array("shao", -13870),
        array("she", -13859),
        array("shen", -13847),
        array("sheng", -13831),
        array("shi", -13658),
        array("shou", -13611),
        array("shu", -13601),
        array("shua", -13406),
        array("shuai", -13404),
        array("shuan", -13400),
        array("shuang", -13398),
        array("shui", -13395),
        array("shun", -13391),
        array("shuo", -13387),
        array("si", -13383),
        array("song", -13367),
        array("sou", -13359),
        array("su", -13356),
        array("suan", -13343),
        array("sui", -13340),
        array("sun", -13329),
        array("suo", -13326),
        array("ta", -13318),
        array("tai", -13147),
        array("tan", -13138),
        array("tang", -13120),
        array("tao", -13107),
        array("te", -13096),
        array("teng", -13095),
        array("ti", -13091),
        array("tian", -13076),
        array("tiao", -13068),
        array("tie", -13063),
        array("ting", -13060),
        array("tong", -12888),
        array("tou", -12875),
        array("tu", -12871),
        array("tuan", -12860),
        array("tui", -12858),
        array("tun", -12852),
        array("tuo", -12849),
        array("wa", -12838),
        array("wai", -12831),
        array("wan", -12829),
        array("wang", -12812),
        array("wei", -12802),
        array("wen", -12607),
        array("weng", -12597),
        array("wo", -12594),
        array("wu", -12585),
        array("xi", -12556),
        array("xia", -12359),
        array("xian", -12346),
        array("xiang", -12320),
        array("xiao", -12300),
        array("xie", -12120),
        array("xin", -12099),
        array("xing", -12089),
        array("xiong", -12074),
        array("xiu", -12067),
        array("xu", -12058),
        array("xuan", -12039),
        array("xue", -11867),
        array("xun", -11861),
        array("ya", -11847),
        array("yan", -11831),
        array("yang", -11798),
        array("yao", -11781),
        array("ye", -11604),
        array("yi", -11589),
        array("yin", -11536),
        array("ying", -11358),
        array("yo", -11340),
        array("yong", -11339),
        array("you", -11324),
        array("yu", -11303),
        array("yuan", -11097),
        array("yue", -11077),
        array("yun", -11067),
        array("za", -11055),
        array("zai", -11052),
        array("zan", -11045),
        array("zang", -11041),
        array("zao", -11038),
        array("ze", -11024),
        array("zei", -11020),
        array("zen", -11019),
        array("zeng", -11018),
        array("zha", -11014),
        array("zhai", -10838),
        array("zhan", -10832),
        array("zhang", -10815),
        array("zhao", -10800),
        array("zhe", -10790),
        array("zhen", -10780),
        array("zheng", -10764),
        array("zhi", -10587),
        array("zhong", -10544),
        array("zhou", -10533),
        array("zhu", -10519),
        array("zhua", -10331),
        array("zhuai", -10329),
        array("zhuan", -10328),
        array("zhuang", -10322),
        array("zhui", -10315),
        array("zhun", -10309),
        array("zhuo", -10307),
        array("zi", -10296),
        array("zong", -10281),
        array("zou", -10274),
        array("zu", -10270),
        array("zuan", -10262),
        array("zui", -10260),
        array("zun", -10256),
        array("zuo", -10254)
    );

    function g($_num) {
        if ($_num > 0 && $_num < 160) {
            return chr($_num);
        } elseif ($_num < -20319 || $_num > -10247) {
            return "";
        } else {
            for ($i = count($this->_py) - 1; $i >= 0; $i--) {
                if ($this->_py[$i][1] <= $_num)
                    break;
            }
            return $this->_py[$i][0];
        }
    }

    function ch2pinyin($_str, $is_utf8=true) {
        if ($is_utf8) {
            $_str = iconv('utf-8', 'gb2312', $_str);
        }
        $ret = "";
        for ($i = 0; $i < strlen($_str); $i++) {
            $p = ord(substr($_str, $i, 1));
            if ($p > 160) {
                $q = ord(substr($_str, ++$i, 1));
                $p = $p * 256 + $q - 65536;
            }
            $ret .= $this->g($p);
        }
        return strtoupper($ret);
    }

    function ch2pinyin1($sourcestr) {
        $returnstr = '';
        $i = 0;
        $n = 0;
        $str_length = strlen($sourcestr); //字符串的字节数
        while ($i <= $str_length) {
            $temp_str = substr($sourcestr, $i, 1);
            $ascnum = Ord($temp_str); //得到字符串中第$i位字符的ascii码
            if ($ascnum >= 224) {  //如果ASCII位高与224，
                $returnstr = $returnstr . $this->getHanziInitial(substr($sourcestr, $i, 3)); //根据UTF-8编码规范，将3个连续的字符计为单个字符
                $i = $i + 3;                //实际Byte计为3
            } else if ($ascnum >= 192) {  //如果ASCII位高与192，
                $returnstr = $returnstr . $this->getHanziInitial(substr($sourcestr, $i, 2)); //根据UTF-8编码规范，将2个连续的字符计为单个字符
                $i = $i + 2;                //实际Byte计为2
            } else if ($ascnum >= 65 && $ascnum <= 90) {  //如果是大写字母，
                $returnstr = $returnstr . substr($sourcestr, $i, 1);
                $i = $i + 1;                //实际的Byte数仍计1个
            } else {  //其他情况下，包括小写字母和半角标点符号，
                $returnstr = $returnstr . strtoupper(substr($sourcestr, $i, 1));  //小写字母转换为大写
                $i = $i + 1;                //实际的Byte数计1个
            }
        }
        return $returnstr;
    }

    function getHanziInitial($s0) {
        if (ord($s0) >= "1" and ord($s0) <= ord("z")) {
            return strtoupper($s0);
        }
        $s = iconv("UTF-8", "gb2312//IGNORE", $s0); // 不要转换成GB2312内没有的字符哦，^_^
        $asc = @ord($s{0}) * 256 + @ord($s{1}) - 65536;
        if ($asc >= -20319 and $asc <= -20284)
            return "A";
        if ($asc >= -20283 and $asc <= -19776)
            return "B";
        if ($asc >= -19775 and $asc <= -19219)
            return "C";
        if ($asc >= -19218 and $asc <= -18711)
            return "D";
        if ($asc >= -18710 and $asc <= -18527)
            return "E";
        if ($asc >= -18526 and $asc <= -18240)
            return "F";
        if ($asc >= -18239 and $asc <= -17923)
            return "G";
        if ($asc >= -17922 and $asc <= -17418)
            return "H";
        if ($asc >= -17417 and $asc <= -16475)
            return "J";
        if ($asc >= -16474 and $asc <= -16213)
            return "K";
        if ($asc >= -16212 and $asc <= -15641)
            return "L";
        if ($asc >= -15640 and $asc <= -15166)
            return "M";
        if ($asc >= -15165 and $asc <= -14923)
            return "N";
        if ($asc >= -14922 and $asc <= -14915)
            return "O";
        if ($asc >= -14914 and $asc <= -14631)
            return "P";
        if ($asc >= -14630 and $asc <= -14150)
            return "Q";
        if ($asc >= -14149 and $asc <= -14091)
            return "R";
        if ($asc >= -14090 and $asc <= -13319)
            return "S";
        if ($asc >= -13318 and $asc <= -12839)
            return "T";
        if ($asc >= -12838 and $asc <= -12557)
            return "W";
        if ($asc >= -12556 and $asc <= -11848)
            return "X";
        if ($asc >= -11847 and $asc <= -11056)
            return "Y";
        if ($asc >= -11055 and $asc <= -10247)
            return "Z";
        return $s0; // 返回原字符，不作转换。（标点、空格、繁体字都会直接返回）
    }

}

?>
